package pe.edu.upc.dsd.epica.web;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.cxf.jaxrs.client.JAXRSClientFactory;
import org.apache.log4j.Logger;
import org.springframework.http.converter.FormHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.context.support.WebApplicationContextUtils;

import pe.edu.upc.dsd.epica.model.Establecimiento;
import pe.edu.upc.dsd.epica.model.Promocion;
import pe.edu.upc.dsd.epica.service.PromocionService;
import pe.edu.upc.dsd.epica.util.Session;
import pe.edu.upc.dsd.epica.util.UrlBuilder;

public class PromocionNewServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;
	private PromocionService promoServiceWs;
	private PromocionService promoServiceRest;
	private final static Logger logger = Logger.getLogger(PromocionNewServlet.class);
	private RestTemplate restTemplate;
	private UrlBuilder builder;
	
	@Override
    public void init(ServletConfig config) throws ServletException {
		this.restTemplate=new RestTemplate();
		
		this.promoServiceWs = WebApplicationContextUtils
				.getWebApplicationContext(config.getServletContext()).getBean(
						"promocionServiceClient",
						PromocionService.class);
		
		builder=WebApplicationContextUtils
				.getWebApplicationContext(config.getServletContext()).getBean(
						"urlBuilder",
						UrlBuilder.class);
		
		this.promoServiceRest = JAXRSClientFactory.create(
				builder.getUrlServicio(),
				PromocionService.class);
			
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		
		Establecimiento establecimiento = Session.ObtenerValor(req.getSession());

		
		if(establecimiento == null)
		{
			req.getRequestDispatcher("CerrarSesion").forward(req, resp);
			return;
		}
				
		String paramCodigoPromocion = req.getParameter("codigo");
				
		if (paramCodigoPromocion != null && !paramCodigoPromocion.equals(""))
		{
			String codigoPromocion = paramCodigoPromocion;
			Promocion promoParam = new Promocion();
			promoParam.setCodigo(codigoPromocion);
			

			try {
				promoParam=promoServiceWs.findByPromocionCode(codigoPromocion);						
			} catch (Exception e) {
				logger.error("Titulo:\nBuscar Promocion por codigo [PromocionService].\nMensaje:\n"+e.getMessage());
			}

			req.setAttribute("promo", promoParam );
		}
		req.getRequestDispatcher("promoNew.jsp").forward(req,resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {

		Establecimiento establecimiento = Session.ObtenerValor(req.getSession());
		
		if(establecimiento == null)
		{
			req.getRequestDispatcher("CerrarSesion").forward(req, resp);
			return;
		}
		
		String codigoEstablecimiento = establecimiento.getCodigo();
		
		try {
			String codProm= req.getParameter("codigo");
			String nomProm= req.getParameter("nombre");
			String desProm= req.getParameter("descripcion");
			String fecvProm= req.getParameter("fechaven");
			int numvProm=  Integer.parseInt(req.getParameter("numerov")); 
			int porcDescto=  Integer.parseInt(req.getParameter("porcDescuento")); 
			String imgProm= req.getParameter("imagen");
			
			Promocion promo = new Promocion();
			promo.setNombre(nomProm);
			promo.setDescripcion(desProm);
			promo.setFecVencimiento(fecvProm);
			promo.setNumVisitas(numvProm);
			promo.setImagen(imgProm);
			promo.setPorDescto(porcDescto);
			Establecimiento est = new Establecimiento();
			est.setCodigo(codigoEstablecimiento);
			promo.setEstablecimiento(est);			
			
			if(codProm== null || codProm.equals(""))
			{
				promoServiceWs.save(promo);
			}
			else{
				promo.setCodigo(codProm);
				promoServiceWs.update(codProm, promo);
			}

		} catch (Exception e) {
			req.setAttribute("error", e.getMessage());
			
			req.getRequestDispatcher("promoNew.jsp").forward(req,resp);
			
			logger.error("Titulo:\nRegistrar Promocion [PromocionService].\nMensaje:\n"+e.getMessage());
			
			return;
		}
		
		req.getRequestDispatcher("Promos").forward(req, resp);
	}

}

